package com.base.schema.proxy.jdk;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * JDK动态代理
 * @ClassName: ServiceProxy
 * @Description: 
 * @Author xuyou
 * @DateTime 2019年12月4日 上午10:07:44
 */
public class JDKProxy implements InvocationHandler {

	
	private Object target;
	
	public JDKProxy(Object target) {
		this.target = target;
	}

	/**
	 * 获取被代理接口实例对象
	 * @Title: getProxy
	 * @Description: 
	 * @Author xuyou
	 * @DateTime 2019年12月4日 上午9:52:00
	 * @param <T>
	 * @return
	 */
	public <T> T getProxy() {
		//通过反射机制，创建一个代理类对象实例并返回。用户进行方法调用时使用
		//创建代理对象时，需要传递该业务类的类加载器（用来获取业务实现类的元数据，在包装方法是调用真正的业务方法）、接口、handler实现类
		return (T) Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
	}
	


	/**
	 * 动态的增加业务逻辑
	 */
	@Override
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		System.out.println("方法执行之前做的一些事情");
		Object invoke = method.invoke(target, args);
		System.out.println("方法执行之后做的一些事情");
		return invoke;
	}

}
